package com.atguigu.c_designed.m1createModel.c1singleton;

/**
 * 单例设计模式介绍
 * 所谓类的单例设计模式，就是采取一定的方法保证在整个的软件系统中，对某个类只能存在一个对象实例，
 * 并且该类只提供一个取得其对象实例的方法(静态方法)。
 */
public class Singleton06 {

    public static void main(String[] args) {
        //测试
        StaticSingleton06 instance = StaticSingleton06.getInstance();
        StaticSingleton06 instance2 = StaticSingleton06.getInstance();
        System.out.println(instance == instance2); // true
        System.out.println("instance.hashCode=" + instance.hashCode());
        System.out.println("instance2.hashCode=" + instance2.hashCode());
    }
}

/**
 *  优缺点说明：
 * 1) 这种方式采用了类装载的机制来保证初始化实例时只有一个线程。
 * 2) 静态内部类方式在 Singleton 类被装载时并不会立即实例化，而是在需要实例化时，调用 getInstance 方法，才
 * 会装载 SingletonInstance 类，从而完成 Singleton 的实例化。
 * 3) 类的静态属性只会在第一次加载类的时候初始化，所以在这里，JVM 帮助我们保证了线程的安全性，在类进行
 * 初始化时，别的线程是无法进入的。
 * 4) 优点：避免了线程不安全，利用静态内部类特点实现延迟加载，效率高
 * 5) 结论：推荐使用
 */
// 懒汉式
class StaticSingleton06 {
    //构造器私有化
    private StaticSingleton06() {
    }

    private static class StaticSingleton {
        private static StaticSingleton06 INSTANCE=new StaticSingleton06();
    }
   public static StaticSingleton06 getInstance(){
        return StaticSingleton.INSTANCE;
    }

}
